Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / core / data / src / commonTest / kotlin / org / meshtastic / core / data / manager / CommandSenderImplTest.kt

Displaying Raw • Download

core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/CommandSenderImplTest.kt 01cd54907d62cd90913d3d071b6bc240cae365ef (01cd5490) Text, 11.24 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.data.manager

Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.answering.returns
Tff7b72import T7ee787dev.mokkery.every
Tff7b72import T7ee787dev.mokkery.everySuspend
Tff7b72import T7ee787dev.mokkery.matcher.any
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787dev.mokkery.verify
Tff7b72import T7ee787dev.mokkery.verifySuspend
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.flowOf
Tff7b72import T7ee787kotlinx.coroutines.test.TestScope
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787okio.ByteString
Tff7b72import T7ee787okio.ByteString.Companion.encodeUtf8
Tff7b72import T7ee787org.meshtastic.core.model.DataPacket
Tff7b72import T7ee787org.meshtastic.core.model.MessageStatus
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.NodeAddress
Tff7b72import T7ee787org.meshtastic.core.repository.NeighborInfoHandler
Tff7b72import T7ee787org.meshtastic.core.repository.NodeManager
Tff7b72import T7ee787org.meshtastic.core.repository.PacketHandler
Tff7b72import T7ee787org.meshtastic.core.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.repository.SessionManager
Tff7b72import T7ee787org.meshtastic.core.repository.TracerouteHandler
Tff7b72import T7ee787org.meshtastic.proto.ChannelSet
Tff7b72import T7ee787org.meshtastic.proto.LocalConfig
Tff7b72import T7ee787org.meshtastic.proto.MeshPacket
Tff7b72import T7ee787org.meshtastic.proto.NeighborInfo
Tff7b72import T7ee787org.meshtastic.proto.PortNum
Tff7b72import T7ee787org.meshtastic.proto.User
Tff7b72import T7ee787kotlin.test.BeforeTest
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFailsWith
Tff7b72import T7ee787kotlin.test.assertNotEquals
Tff7b72import T7ee787kotlin.test.assertTrue

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLargeClassTa5d6ff"Tb4b4b4)
Tff7b72class T56d364CommandSenderImplTest Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3packetHandler Tff7b72= Te6edf3mockTff7b72<Te6edf3PacketHandlerTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3nodeManager Tff7b72= Te6edf3mockTff7b72<Te6edf3NodeManagerTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3radioConfigRepository Tff7b72= Te6edf3mockTff7b72<Te6edf3RadioConfigRepositoryTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3tracerouteHandler Tff7b72= Te6edf3mockTff7b72<Te6edf3TracerouteHandlerTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3neighborInfoHandler Tff7b72= Te6edf3mockTff7b72<Te6edf3NeighborInfoHandlerTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3sessionManager Tff7b72= Te6edf3mockTff7b72<Te6edf3SessionManagerTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)

Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3commandSenderTb4b4b4: Te6edf3CommandSenderImpl

Tf0883e@BeforeTest
Tff7b72fun Td2a8ffsetupTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3every Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3localConfigFlow Tb4b4b4} Te6edf3returns Te6edf3flowOfTb4b4b4(Te6edf3LocalConfigTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3channelSetFlow Tb4b4b4} Te6edf3returns Te6edf3flowOfTb4b4b4(Te6edf3ChannelSetTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3myNodeNum Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Te6edf3MY_NODE_NUMTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3nodeDBbyNodeNum Tb4b4b4} Te6edf3returns Te6edf3emptyMapTb4b4b4(Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3sessionManagerTb4b4b4.Te6edf3getPasskeyTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3ByteStringTb4b4b4.Te6edf3EMPTY

Te6edf3commandSender Tff7b72=
Te6edf3CommandSenderImplTb4b4b4(
Te6edf3packetHandler Tff7b72= Te6edf3packetHandlerTb4b4b4,
Te6edf3nodeManager Tff7b72= Te6edf3nodeManagerTb4b4b4,
Te6edf3radioConfigRepository Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4,
Te6edf3tracerouteHandler Tff7b72= Te6edf3tracerouteHandlerTb4b4b4,
Te6edf3neighborInfoHandler Tff7b72= Te6edf3neighborInfoHandlerTb4b4b4,
Te6edf3sessionManager Tff7b72= Te6edf3sessionManagerTb4b4b4,
Te6edf3scope Tff7b72= Te6edf3TestScopeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e// --- generatePacketId ---

Tf0883e@Test
Tff7b72fun Td2a8ffgeneratePacketId_returnsNonZeroTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3id Tff7b72= Te6edf3commandSenderTb4b4b4.Te6edf3generatePacketIdTb4b4b4(Tb4b4b4)
Te6edf3assertNotEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3idTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffgeneratePacketId_isIncrementingTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3first Tff7b72= Te6edf3commandSenderTb4b4b4.Te6edf3generatePacketIdTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3second Tff7b72= Te6edf3commandSenderTb4b4b4.Te6edf3generatePacketIdTb4b4b4(Tb4b4b4)
Te6edf3assertNotEqualsTb4b4b4(Te6edf3firstTb4b4b4, Te6edf3secondTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffgeneratePacketId_staysNonZeroOverManyIterationsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3repeatTb4b4b4(T79c0ff1T79c0ff0T79c0ff0Tb4b4b4) Tb4b4b4{ Te6edf3assertNotEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3commandSenderTb4b4b4.Te6edf3generatePacketIdTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

T8b949e// --- resolveNodeNum ---

Tf0883e@Test
Tff7b72fun Td2a8ffresolveNodeNum_broadcast_returnsNodeNumBroadcastTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3result Tff7b72= Te6edf3commandSenderTb4b4b4.Te6edf3resolveNodeNumTb4b4b4(Te6edf3NodeAddressTb4b4b4.Te6edf3BroadcastTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3NodeAddressTb4b4b4.Te6edf3NODENUM_BROADCASTTb4b4b4, Te6edf3resultTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffresolveNodeNum_local_returnsMyNodeNumTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3result Tff7b72= Te6edf3commandSenderTb4b4b4.Te6edf3resolveNodeNumTb4b4b4(Te6edf3NodeAddressTb4b4b4.Te6edf3LocalTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MY_NODE_NUMTb4b4b4, Te6edf3resultTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffresolveNodeNum_local_returnsZeroWhenMyNodeNumNullTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3myNodeNum Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3commandSender Tff7b72=
Te6edf3CommandSenderImplTb4b4b4(
Te6edf3packetHandler Tff7b72= Te6edf3packetHandlerTb4b4b4,
Te6edf3nodeManager Tff7b72= Te6edf3nodeManagerTb4b4b4,
Te6edf3radioConfigRepository Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4,
Te6edf3tracerouteHandler Tff7b72= Te6edf3tracerouteHandlerTb4b4b4,
Te6edf3neighborInfoHandler Tff7b72= Te6edf3neighborInfoHandlerTb4b4b4,
Te6edf3sessionManager Tff7b72= Te6edf3sessionManagerTb4b4b4,
Te6edf3scope Tff7b72= Te6edf3TestScopeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3commandSenderTb4b4b4.Te6edf3resolveNodeNumTb4b4b4(Te6edf3NodeAddressTb4b4b4.Te6edf3LocalTb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffresolveNodeNum_byNum_returnsPassthroughTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(T79c0ff4T79c0ff2Tb4b4b4, Te6edf3commandSenderTb4b4b4.Te6edf3resolveNodeNumTb4b4b4(Te6edf3NodeAddressTb4b4b4.Te6edf3ByNumTb4b4b4(T79c0ff4T79c0ff2Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffresolveNodeNum_byId_looksUpAndReturnsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff9T79c0ff9Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!deadbeefTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3getNodeByIdTb4b4b4(Ta5d6ff"Ta5d6ff!deadbeefTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3node
Te6edf3assertEqualsTb4b4b4(T79c0ff9T79c0ff9Tb4b4b4, Te6edf3commandSenderTb4b4b4.Te6edf3resolveNodeNumTb4b4b4(Te6edf3NodeAddressTb4b4b4.Te6edf3ByIdTb4b4b4(Ta5d6ff"Ta5d6ff!deadbeefTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffresolveNodeNum_byId_throwsForUnknownTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3every Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3getNodeByIdTb4b4b4(Ta5d6ff"Ta5d6ff!unknownTa5d6ff"Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72null
Te6edf3assertFailsWithTff7b72<Te6edf3IllegalArgumentExceptionTff7b72> Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3resolveNodeNumTb4b4b4(Te6edf3NodeAddressTb4b4b4.Te6edf3ByIdTb4b4b4(Ta5d6ff"Ta5d6ff!unknownTa5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

T8b949e// --- sendData ---

Tf0883e@Test
Tff7b72fun Td2a8ffsendData_setsIdWhenZeroTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff^allTa5d6ff"Tb4b4b4, Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4.Te6edf3encodeUtf8Tb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3packetTb4b4b4.Te6edf3id Tff7b72= T79c0ff0
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit

Te6edf3commandSenderTb4b4b4.Te6edf3sendDataTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3assertNotEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3packetTb4b4b4.Te6edf3idTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffsendData_setsStatusQueuedTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff^allTa5d6ff"Tb4b4b4, Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffhelloTa5d6ff"Tb4b4b4.Te6edf3encodeUtf8Tb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit

Te6edf3commandSenderTb4b4b4.Te6edf3sendDataTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3statusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffsendData_rejectsOversizedPayloadTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3oversizedBytes Tff7b72= Te6edf3ByteStringTb4b4b4.Te6edf3ofTb4b4b4(Tff7b72*Te6edf3ByteArrayTb4b4b4(T79c0ff3T79c0ff0T79c0ff0Tb4b4b4) Tb4b4b4{ T79c0ff0Te6edf3x42 Tb4b4b4}Tb4b4b4)
Tff7b72val Te6edf3packet Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff^allTa5d6ff"Tb4b4b4, Te6edf3bytes Tff7b72= Te6edf3oversizedBytesTb4b4b4, Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4)

Tff7b72val Te6edf3ex Tff7b72= Te6edf3assertFailsWithTff7b72<Te6edf3IllegalStateExceptionTff7b72> Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendDataTb4b4b4(Te6edf3packetTb4b4b4) Tb4b4b4}
Te6edf3assertTrueTb4b4b4(Te6edf3exTb4b4b4.Te6edf3messageTff7b72!!Tb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffMessage too longTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3statusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffsendData_requiresNonZeroDataTypeTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff^allTa5d6ff"Tb4b4b4, Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4.Te6edf3encodeUtf8Tb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3dataType Tff7b72= T79c0ff0Tb4b4b4)
Te6edf3assertFailsWithTff7b72<Te6edf3IllegalArgumentExceptionTff7b72> Tb4b4b4{ Te6edf3commandSenderTb4b4b4.Te6edf3sendDataTb4b4b4(Te6edf3packetTb4b4b4) Tb4b4b4}
Tb4b4b4}

T8b949e// --- sendAdmin ---

Tf0883e@Test
Tff7b72fun Td2a8ffsendAdmin_injectsSessionPasskeyTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3passkey Tff7b72= Ta5d6ff"Ta5d6ffsecretTa5d6ff"Tb4b4b4.Te6edf3encodeUtf8Tb4b4b4(Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3sessionManagerTb4b4b4.Te6edf3getPasskeyTb4b4b4(Te6edf3DEST_NODETb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3passkey
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit

Te6edf3commandSenderTb4b4b4.Te6edf3sendAdminTb4b4b4(Te6edf3DEST_NODETb4b4b4) Tb4b4b4{ Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3AdminMessageTb4b4b4(Te6edf3get_owner_request Tff7b72= Tff7b72trueTb4b4b4) Tb4b4b4}

Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

T8b949e// --- requestTraceroute ---

Tf0883e@Test
Tff7b72fun Td2a8ffrequestTraceroute_recordsStartTimeTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit

Te6edf3commandSenderTb4b4b4.Te6edf3requestTracerouteTb4b4b4(Te6edf3requestId Tff7b72= T79c0ff4T79c0ff2Tb4b4b4, Te6edf3destNum Tff7b72= Te6edf3DEST_NODETb4b4b4)

Te6edf3verify Tb4b4b4{ Te6edf3tracerouteHandlerTb4b4b4.Te6edf3recordStartTimeTb4b4b4(T79c0ff4T79c0ff2Tb4b4b4) Tb4b4b4}
Tb4b4b4}

T8b949e// --- requestNeighborInfo ---

Tf0883e@Test
Tff7b72fun Td2a8ffrequestNeighborInfo_localNode_usesCachedNeighborInfoTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3cached Tff7b72= Te6edf3NeighborInfoTb4b4b4(Te6edf3node_id Tff7b72= Te6edf3MY_NODE_NUMTb4b4b4, Te6edf3last_sent_by_id Tff7b72= Te6edf3MY_NODE_NUMTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3neighborInfoHandlerTb4b4b4.Te6edf3lastNeighborInfo Tb4b4b4} Te6edf3returns Te6edf3cached
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit

Te6edf3commandSenderTb4b4b4.Te6edf3requestNeighborInfoTb4b4b4(Te6edf3requestId Tff7b72= T79c0ff1Tb4b4b4, Te6edf3destNum Tff7b72= Te6edf3MY_NODE_NUMTb4b4b4)

Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffrequestNeighborInfo_localNode_generatesDummyWhenNoCachedTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3every Tb4b4b4{ Te6edf3neighborInfoHandlerTb4b4b4.Te6edf3lastNeighborInfo Tb4b4b4} Te6edf3returns Tff7b72null
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit

Te6edf3commandSenderTb4b4b4.Te6edf3requestNeighborInfoTb4b4b4(Te6edf3requestId Tff7b72= T79c0ff1Tb4b4b4, Te6edf3destNum Tff7b72= Te6edf3MY_NODE_NUMTb4b4b4)

Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffrequestNeighborInfo_remoteNode_sendsRequestTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit

Te6edf3commandSenderTb4b4b4.Te6edf3requestNeighborInfoTb4b4b4(Te6edf3requestId Tff7b72= T79c0ff1Tb4b4b4, Te6edf3destNum Tff7b72= Te6edf3DEST_NODETb4b4b4)

Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

T8b949e// --- sendPosition ---

Tf0883e@Test
Tff7b72fun Td2a8ffsendPosition_updatesLocalPositionWhenNotFixedTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit

Tff7b72val Te6edf3pos Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3PositionTb4b4b4(Te6edf3latitude_i Tff7b72= T79c0ff1T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0Tb4b4b4, Te6edf3longitude_i Tff7b72= T79c0ff2T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)
Te6edf3commandSenderTb4b4b4.Te6edf3sendPositionTb4b4b4(Te6edf3posTb4b4b4)

Te6edf3verify Tb4b4b4{ Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedPositionTb4b4b4(Te6edf3MY_NODE_NUMTb4b4b4, Te6edf3MY_NODE_NUMTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffsendPosition_skipsLocalUpdateWhenFixedPositionTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Use MutableStateFlow so the init launchIn picks it up immediately in TestScope
Tff7b72val Te6edf3configFlow Tff7b72=
Te6edf3MutableStateFlowTb4b4b4(Te6edf3LocalConfigTb4b4b4(Te6edf3position Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3ConfigTb4b4b4.Te6edf3PositionConfigTb4b4b4(Te6edf3fixed_position Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3localConfigFlow Tb4b4b4} Te6edf3returns Te6edf3configFlow
Te6edf3every Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3channelSetFlow Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Te6edf3ChannelSetTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3testScope Tff7b72= Te6edf3TestScopeTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3fixedSender Tff7b72=
Te6edf3CommandSenderImplTb4b4b4(
Te6edf3packetHandler Tff7b72= Te6edf3packetHandlerTb4b4b4,
Te6edf3nodeManager Tff7b72= Te6edf3nodeManagerTb4b4b4,
Te6edf3radioConfigRepository Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4,
Te6edf3tracerouteHandler Tff7b72= Te6edf3tracerouteHandlerTb4b4b4,
Te6edf3neighborInfoHandler Tff7b72= Te6edf3neighborInfoHandlerTb4b4b4,
Te6edf3sessionManager Tff7b72= Te6edf3sessionManagerTb4b4b4,
Te6edf3scope Tff7b72= Te6edf3testScopeTb4b4b4,
Tb4b4b4)
Te6edf3testScopeTb4b4b4.Te6edf3testSchedulerTb4b4b4.Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3anyTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tffa657Unit

Tff7b72val Te6edf3pos Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3PositionTb4b4b4(Te6edf3latitude_i Tff7b72= T79c0ff1T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0Tb4b4b4, Te6edf3longitude_i Tff7b72= T79c0ff2T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)
Te6edf3fixedSenderTb4b4b4.Te6edf3sendPositionTb4b4b4(Te6edf3posTb4b4b4)

Te6edf3verifyTb4b4b4(Te6edf3mode Tff7b72= Te6edf3devTb4b4b4.Te6edf3mokkeryTb4b4b4.Te6edf3verifyTb4b4b4.Te6edf3VerifyModeTb4b4b4.Te6edf3notTb4b4b4) Tb4b4b4{
Te6edf3nodeManagerTb4b4b4.Te6edf3handleReceivedPositionTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72const Tff7b72val Te6edf3MY_NODE_NUM Tff7b72= T79c0ff1T79c0ff0T79c0ff0
Tff7b72private Tff7b72const Tff7b72val Te6edf3DEST_NODE Tff7b72= T79c0ff2T79c0ff0T79c0ff0
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.11s